package com.lingnuo.service.Impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lingnuo.mapper.UserMapper;
import com.lingnuo.pojo.PageRequest;
import com.lingnuo.pojo.User;
import com.lingnuo.service.UserService;
import com.lingnuo.util.Result;
import org.mybatis.logging.Logger;
import org.mybatis.logging.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

@Service
@Transactional
public class UserServiceImpl implements UserService {
    private static final String[] ALLOWED_EXTENSIONS = {"jpg", "jpeg", "png", "gif"};
    // 文件位置 与Src同目录
    private static final String UPLOAD_DIR = "uploads/";
    // 文件位置：src/main/resources/static/images/default-avatar.jpg
    private static final String DEFAULT_AVATAR = "/images/default-avatar.png";

    // 自动注册UserMapper
    @Autowired
    private UserMapper userMapper;

    /**
     * 登录
     *
     * @param user 用户
     * @return {@code User }
     */
    @Override
    public User login(User user) {
        return userMapper.login(user);
    }

    /**
     * 注册
     *
     * @param user 用户
     * @return 注册操作影响的数据库行数，成功时返回大于0的值，失败时返回0
     */
    @Override
    public int register(User user) {
        if(user.getImagePath() == null) {
            user.setImagePath(DEFAULT_AVATAR);
        }
        return userMapper.register(user);
    }

    /**
     * 按用户名选择用户
     *
     * @param username 用户名
     * @return int
     */
    @Override
    public int selectUserByUsername(String username) {
        return userMapper.selectUserByUsername(username);
    }

    /**
     * 获取所有用户信息
     *
     * @return 用户列表
     */
    @Override
    public List<User> getAllUsers() {
        return userMapper.getAllUsers();
    }

    /**
     * 根据用户ID获取用户信息
     *
     * @param id 用户ID
     * @return 用户信息，如果未找到则返回null
     */
    @Override
    public User getUserById(int id) {
        return userMapper.getUserById(id);
    }

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return 更新操作影响的数据库行数，成功时返回大于0的值，失败时返回0
     */
    @Override
    public int updateUser(User user) {
        if (user.getImagePath() != null) {
            return userMapper.updateUserImagePath(user);
        }
        return userMapper.updateUser(user);
    }

    /**
     * 根据用户ID删除用户
     *
     * @param id 用户ID
     * @return 删除操作影响的数据库行数，成功时返回大于0的值，失败时返回0
     */
    @Override
    public int deleteUser(int id) {
        return userMapper.deleteUser(id);
    }

    /**
     * 获取所有用户
     *
     * @param pageRequest 页面请求
     * @return {@code PageInfo<User> }
     */
    @Override
    public PageInfo<User> getAllUsers(PageRequest pageRequest) {
        // 开启分页
        PageHelper.startPage(pageRequest.getPage(), pageRequest.getSize());
        List<User> users = userMapper.getAllUsers();
        // 获取分页信息
        return new PageInfo<>(users);
    }

    /**
     * 上传用户图片
     *
     * @param image  图像
     * @param userId 用户 ID
     * @return {@code Result }
     */
    @Override
    @Transactional
    public Result uploadUserImage(MultipartFile image, int userId) {
        if (image.isEmpty()) {
            return Result.error("上传图片为空");
        }

        // 验证文件类型
        String originalFilename = image.getOriginalFilename();
        if (originalFilename == null || originalFilename.contains("..")) {
            return Result.error("文件名不合法");
        }

        String extension = getFileExtension(originalFilename);
        if (!isValidImageExtension(extension)) {
            return Result.error("仅支持JPG/JPEG/PNG/GIF格式");
        }

        // 准备存储目录
        File uploadDir = new File(UPLOAD_DIR);
        if (!uploadDir.exists() && !uploadDir.mkdirs()) {
            return Result.error("系统存储错误");
        }

        // 生成唯一文件名
        String fileName = UUID.randomUUID() + "." + extension;
        File targetFile = new File(uploadDir, fileName);

        try {
            // 存储文件
            image.transferTo(targetFile);

            // 更新数据库
            User user = new User();
            user.setId(userId);
            user.setImagePath(UPLOAD_DIR + fileName);
            int result = userMapper.updateUser(user);

            if (result > 0) {
                return Result.success("上传成功");
            } else {
                // 回滚已上传文件
                if (!targetFile.delete()) {
                    return Result.error("系统存储错误");
                }
                return Result.error("用户不存在");
            }
        } catch (IOException e) {
            return Result.error("文件存储失败");
        }
    }


    /**
     * 获取文件扩展名
     *
     * @param filename 文件名
     * @return {@code String }
     */
    private String getFileExtension(String filename) {
        int lastDotIndex = filename.lastIndexOf('.');
        if (lastDotIndex == -1) {
            return "";
        }
        return filename.substring(lastDotIndex + 1).toLowerCase();
    }

    /**
     * 是有效图像扩展名
     *
     * @param extension 外延
     * @return boolean
     */
    private boolean isValidImageExtension(String extension) {
        for (String allowedExt : ALLOWED_EXTENSIONS) {
            if (allowedExt.equalsIgnoreCase(extension)) {
                return true;
            }
        }
        return false;
    }
}